<?php
/**
 * @author		João Batista Neto
 * @brief		Classes e interfaces utilitárias
 * @package		rpo.util
 */

require_once 'rpo/base/Object.php';
require_once 'rpo/util/MapStep.php';
require_once 'rpo/util/ReduceStep.php';

/**
 * @brief	Base para implementação de um objeto que contém os passos Map, Reduce e Finalize.
 * @details	Essa classe apenas deriva a classe Object para reduzir o esforço necessário para
 * implementação da interface IObject, todos os métodos map(), reduce() e finalize() precisam
 * ser implementados pela classe que derivar essa.
 * @class	AbstractMapReduceStep
 */
abstract class AbstractMapReduceStep extends Object implements MapStep, ReduceStep {
	/**
	 * @brief	Aceita um valor para ser mapeado
	 * @param	$mapReduce MapReduce Objeto que está fazendo o mapeamento
	 * @param	$key mixed Chave que será utilizada para o mapeamento
	 * @param	$value mixed Valor que será mapeado
	 * @see		MapReduce.emit()
	 * @throws	BadMethodCallException Se o método não tiver sido implementado.
	 */
	public function map( MapReduce $mapReduce , $key , $value ){
		throw new BadMethodCallException( sprintf( 'O método %s não foi implementado.' , __METHOD__ ) );
	}

	/**
	 * @brief	Executa a redução
	 * @param	$mapReduce MapReduce Objeto que está fazendo o mapeamento
	 * @param	$key mixed Chave que será reduzida
	 * @param	$values Iterator Valores mapeados para a chave
	 */
	public function reduce( MapReduce $mapReduce , $key , Iterator $values ){
	}
}